package cn.itsource.basic.util;

import cn.itsource.org.pojo.domain.Department;
import com.alibaba.fastjson.JSONObject;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;

import java.util.concurrent.TimeUnit;

@Component //把这个类交给spring管理了，只要交给spring管理，就可以@Autowired 注入
public class RedisService {
    @Autowired //StringRedisTemplate它是redisTemplate的子类，而且独有特点：它保存的数据key和value都是string
    private StringRedisTemplate stringRedisTemplate;

    /*public static void main(String[] args) {

        Department department = new Department();
        department.setName("研发部");
        department.setSn("007");

        //{"name":"研发部","sn":"007"}
        String s = JSONObject.toJSONString(department);

        System.out.println(s);

        //set属性 setName setSn  BeanUtil
        Department department1 = JSONObject.parseObject(s, Department.class);

        System.out.println(department1);
    }*/






    /**
     * 向Redis中存储 key-value键值对数据，value的类型为object
     * 操作对象
     * @param key
     * @param value
     */
    public void setStringKeyAndValue(String key, Object value) {

        stringRedisTemplate.opsForValue().set(key, JSONObject.toJSONString(value));
    }

    /**
     * 保存key-value键值对到 redis,存储的value是字符串类型
     *
     * @param key
     * @param value
     */
    public void setStringKeyAndValue(String key, String value) {
        stringRedisTemplate.opsForValue().set(key, value);
    }

    /**
     * 存储的数据，多了一个 有效时间
     *
     * @param key
     * @param value
     * @param minute
     */
    public void setStringKeyAndValue(String key, Object value, long minute) {
        stringRedisTemplate.opsForValue().set(key, JSONObject.toJSONString(value), minute, TimeUnit.MINUTES);
    }

    public void setStringKeyAndValue(String key, String value, long minute) {
        stringRedisTemplate.opsForValue().set(key, value, minute, TimeUnit.MINUTES);
    }

    /**
     * 存秒
     * @param key
     * @param value
     * @param minute
     */
    public void setStringKeyAndValue(long minute,String key, String value) {
        stringRedisTemplate.opsForValue().set(key, value, minute, TimeUnit.SECONDS);
    }

    /**
     * 功能说明 取出对象并转换为对象类型
     *
     * @param key
     * @param clazz
     * @return T
     * @author caiwen
     * @date 2020/8/22
     *
     *
     *
     */
    public static void main(String[] args) {

        System.out.println(String.class.getName());
        System.out.println(Department.class.getName());
    }
    //传入的这个数据类型，可能是2种类型：1string; 2object，如果是object，要进行泛型转换
    public <T> T getKeyObjectValue(String key, Class<T> clazz) {
        T t = null;
        String s = stringRedisTemplate.opsForValue().get(key);//json格式的字符串//{"name":"张三","age":22,"address":"湖北武汉长城科技园"}
        if (StringUtils.isBlank(s)) {
            return null;
        }
        //下面这个判断，是判断传入的Class类型是什么
        //clazz.getName() 获取传入的参数clazz的数据类型 String.class
        if (StringUtils.equalsIgnoreCase(clazz.getName(), "java.lang.string")) {
            t = (T) s;

        //Department.class {"name":"wtb","age":12}
        } else if (StringUtils.isNotBlank(s)) {
                    //{"name":"wtb","sn":"12"}  Department.class
            t = JSONObject.parseObject(s, clazz);
        }
        return t;
    }

    /**
     * 获取String类型直接调用这个方法
     * @param key
     * @return
     */
    public String getKeyStringValue(String key) {
        //直接传String.class
        return getKeyObjectValue(key,String.class);
    }

    public void deleteRedisByKey(String key) {
        stringRedisTemplate.delete(key);
    }
}